package com.huaguoguo.cyg.vcs.manager;

import cn.hutool.core.io.FileUtil;
import com.huaguoguo.cyg.entity.po.SVNCommintLog;
import lombok.Data;
import lombok.extern.slf4j.Slf4j;
import org.springframework.core.io.FileUrlResource;
import org.springframework.core.io.support.PropertiesLoaderUtils;

import java.io.IOException;
import java.util.List;
import java.util.Properties;

/**
 * description: 版本控制管理器
 * author:huaguoguo
 * Date: 2020/3/29
 * Time: 22:03
 */
@Slf4j
@Data
public abstract class VersionControlManager {

    /**
     * 模块根目录
     */
    protected String moduleRootPath;
    /**
     * 编译后的文件夹路径
     */
    protected String moduleBuildPath;
    /**
     * build.properties配置文件的路径
     */
    protected String buildPropertiesPath;
    /**
     * 日志文件路径
     */
    protected String logPath;
    /**
     * 提交人
     */
    protected String commiterName;
    /**
     * 导出路径
     */
    protected String expPath;
    protected Properties properties;

    /**
     * 初始化版本控制器管理对象
     *
     * @param moduleRootPath
     * @param expPath
     * @param commiterName
     * @throws IOException
     */
    public void init(String moduleRootPath, String expPath, String commiterName) throws IOException {
        // 初始化各路径
        this.setModuleRootPath(moduleRootPath);
        this.setModuleBuildPath(moduleRootPath + "build\\oracle\\");
        this.setBuildPropertiesPath(moduleRootPath + "build.properties");
        this.setExpPath(expPath + commiterName + "\\");
        this.setCommiterName(commiterName);
        this.setLogPath(this.getExpPath() + commiterName + ".log");
        // 加载配置文件
        this.setProperties(PropertiesLoaderUtils.loadProperties(new FileUrlResource(this.getBuildPropertiesPath())));
        // 清空导出文件夹
        FileUtil.clean(this.getExpPath());
    }

    /**
     * 通过命令拉取代码提交记录
     * @throws IOException
     */
    public abstract void execLogCmd() throws IOException;

    /**
     * 解析提交日志得到分组的提交信息列表
     * @return
     */
    public abstract List<List<String>> parseSVNLogFile();

    /**
     * 解析出提交记录结构化对象
     * @param oneInfoList
     * @return
     */
    public abstract List<SVNCommintLog> getSVNCommintLogList(List<List<String>> oneInfoList);

    /**
     * 复制和移动提交文件到指定目录
     * @param svnCommintLogList
     */
    public abstract void copyAndMoveCommitFile(List<SVNCommintLog> svnCommintLogList);
}
